# -*- coding: utf-8; -*-
require 'socket'
require 'nkf'
# ruby1.9はUCS32BEを扱うのに標準ライブラリ kconv を使う
#require 'kconv'
# ruby1.8.x は外部ライブラリ rbuconv を使う
require 'rbuconv.rb'

class ToQC
  public
  def initialize
    @address = '225.0.0.0'
    @ports =  [50001, 50002, 50003, 50004, 50005]
    @port_star =  51001
    @sockets = Hash.new # port => time
    @ports.each do |port|
    @sockets[port] = nil
    end
    @queue = Array.new
  end

  def queue_empty?
    @queue.empty?
  end

  # 未表示文を表示したいときは引数 nil で呼び出し
  def send(str)
     @queue.push str unless str == nil # 一度queueにいれる
     return true if @queue.empty?
     to_str = @queue.shift # queue 先頭から取り出し
     result = send_str(to_str)
     if result == false
       @queue.unshift to_str # queue の先頭に戻す
       return false # まだ表示したいのだけど、空き無し
     end
     send(nil) unless @queue.empty?
     return true # 全部表示できた
  end

  private

  # 前の送信から11秒経過したportがあれば送信
  def send_str(str)
     @sockets.each do | port, time |  
       now = Time.now
       if time == nil || time < now -11 # sec
         send_star(str)         # star
         #p "#{str} : #{port} : #{time}"
         send_UDP(str, port)  # メッセージ
         @sockets[port] = Time.now
         return true
       end
     end
    return false # 送信できなかったので差し戻し
   end

  def send_star(str)
    # ruby1.9対応するときはここ要変更
    str_u8 = NKF.nkf('--utf8', str)
    if str_u8 =~ /\*/ui or str_u8 =~ /★/u or str_u8 =~ /☆/u # u: UTF-8, i: 大文字小文字無視
      send_UDP("star", @port_star)
   end
  end

  def send_UDP(str, port)
    socket = UDPSocket.open()
    socket.connect(@address, port)
    str_u8 = NKF.nkf('--utf8', str)
   
    # rbuconv
    str_utf32LE = Uconv.u8tou4(str_u8)
    str_u32BE = Uconv.u4swap(str_utf32LE)
    #ruby1.9.1
    #  str_u32BE = Kconv.kconv(str_u8,  Kconv::UTF32,  Kconv::UTF8)
    
    socket.send(str_u32BE, 0)
  end
end

